package main

import (
	"fmt"
	"sync"
)

func main() {
	doOnce()
}

// doOnce 函数确保 onceBody 函数只执行一次，即使在多个 goroutine 中调用
func doOnce() {
	var once sync.Once
	onceBody := func() {
		fmt.Println("Only once")
	}

	done := make(chan bool)

	// 启动 10 个 goroutine，每个 goroutine 都会尝试执行 onceBody
	for i := 0; i < 10; i++ {
		go func() {
			// 使用 Once.Do 来保证 onceBody 只执行一次
			once.Do(onceBody)
			done <- true
		}()
	}

	// 等待所有 goroutine 完成
	for i := 0; i < 10; i++ {
		<-done
	}
}
